'use strict';
/** pg数据库 */
module.exports.DB = require("./pgsql");
/** redis数据库 */
module.exports.RS = require("./redis");
/** mssql数据库 */
module.exports.MDB = require("./mssql");
/** 检查参数 */
module.exports.checkParam = function(pa, d){
    if(!d[2]){
        LOG.error("cp", d);
        return false;
    } 
    if(typeof(pa) == 'string'){
        if(!(pa in d[2])){
            LOG.error("cp2", d);
            return false;
        } 
    }else{
        for(let k in pa){
			if(!(pa[k] in d[2])){
				LOG.error('cp3', pa[k], d);
				return false;
			}
		}
    }
    return true;
}

/** 发送消息 */
exports.send = function send(dd, d){
    let buf = null, len = d.length;
    if(typeof(d) != 'string'){
        if(d[1] < 80) d[1] += 100;
        d = JSON.stringify(d);
        len = Buffer.byteLength(d);
        LOG.info('S', dd.userid, d);
    }else{
        LOG.info('S_', dd.userid, d.length);
    }
    buf = Buffer.allocUnsafe(len + 16);
    buf.writeUInt16LE(len + 16, 0);
    buf.writeUInt16LE(SERVERID, 2);
    buf.writeUInt32LE(dd.index, 4);
    buf.writeUInt32LE(dd.userid, 8);
    buf.writeUInt32LE(dd.channelid, 12);
    if(len > 0) buf.write(d, 16);
    CLIENT.write(buf);
}

/** 发送错误 */
exports.sendE = function(s, d){
    d = '[0,88,'+d+']'
    LOG.info('S', s.U && s.U.uid || 0, d);
    s.send(d);
}
/** 发送关闭 */
exports.sendClose = function(ud){
    d = '[0,88,'+d+']'
    LOG.info('S', s.U && s.U.uid || 0, d);
    s.send(d);
}

/** 根据serverid获取kindid */
exports.getKindID = function(sid){
    if(!this.KID){

    }
    return this.KID[sid];
}

/** 发送到指定用户 */
exports.sendUser = function(uid, d){
    if(Array.isArray(uid)){
        for(let u of uid) USERMAP[u] && exports.send(USERMAP[u], d);
    }else if(uid == 0){ //给所有的用户发送
        for(let k in USERMAP) exports.send(USERMAP[k], d);
    }else{
        USERMAP[uid] && exports.send(USERMAP[uid], d);
    }
}

/** 计算md5 */
exports.MD5 = function MD5(str){
	const crypto = require('crypto');
	let md5 = crypto.createHash("md5");
	md5.update(str);
	return md5.digest('hex');
}

/** 玩家游戏状态 */
exports.US = {
    /**没有状态 */
    NULL:0x00,
    /**站立状态 */
    FREE:0x01,
    /**坐下状态 */
    SIT:0x02,
    /**同意状态 */
    READY:0x03,
    /**旁观状态 */
    LOOKON:0x04,
    /**游戏状态 */
    PLAY:0x05,
    /**断线状态 */
    OFFLINE:0x06,
    /**比赛状态 */
    MATCH:0x07,
    /**托管状态 */
    TRUST:0x08
};